//! 多产品类型API测试
//! 
//! 同时测试Spot、USDM、COINM等多个产品类型的API

use binance_sdk_unified::{
    client::BinanceClientBuilder, ProductType, Environment, Result,
};

#[tokio::main]
async fn main() -> Result<()> {
    // 初始化日志
    tracing_subscriber::fmt::init();

    println!("🚀 多产品类型API综合测试");
    println!("================================");

    // 测试配置
    let test_cases = vec![
        ("现货交易", ProductType::Spot, Environment::Live),
        ("USDT期货", ProductType::UsdM, Environment::Live),
        ("币本位期货", ProductType::CoinM, Environment::Live),
    ];

    for (name, product_type, environment) in test_cases {
        println!("\n📊 测试: {} ({:?} - {:?})", name, product_type, environment);
        println!("{}", "=".repeat(50));

        // 从环境变量获取API密钥，如果没有则使用默认值
        let api_key = std::env::var("BINANCE_API_KEY").unwrap_or_else(|_| "test_api_key".to_string());
        let secret_key = std::env::var("BINANCE_SECRET_KEY").unwrap_or_else(|_| "test_secret_key".to_string());
        
        // 打印使用的API密钥信息
        println!("🔑 使用的API密钥信息:");
        println!("   API Key: {}", if api_key.len() > 8 { 
            format!("{}...{}", &api_key[..4], &api_key[api_key.len()-4..]) 
        } else { 
            api_key.clone() 
        });
        println!("   Secret Key: {}", if secret_key.len() > 8 { 
            format!("{}...{}", &secret_key[..4], &secret_key[secret_key.len()-4..]) 
        } else { 
            secret_key.clone() 
        });

        // 创建客户端
        let client = BinanceClientBuilder::new(
            api_key,
            secret_key,
            product_type,
        )
        .environment(environment)
        .timeout(30)
        .retry_count(3)
        .build()?;

        // 测试公共API
        test_public_apis(&client, &name).await?;

        // 测试需要认证的API
        test_authenticated_apis(&client, &name).await?;
    }

    println!("\n🎉 多产品类型API测试完成！");
    println!("================================");

    Ok(())
}

/// 测试公共API
async fn test_public_apis(client: &binance_sdk_unified::BinanceClient, _name: &str) -> Result<()> {
    println!("🔍 测试公共API...");

    // 1. 服务器时间
    match client.rest().market().get_server_time().await {
        Ok(server_time) => println!("   ✅ 服务器时间: {}", server_time.server_time),
        Err(e) => println!("   ❌ 服务器时间失败: {}", e),
    }

    // 2. 交易对信息
    match client.rest().market().get_exchange_info().await {
        Ok(exchange_info) => {
            println!("   ✅ 交易对数量: {}", exchange_info.symbols.len());
            if let Some(symbol) = exchange_info.symbols.first() {
                println!("      第一个交易对: {}", symbol.symbol);
            }
        },
        Err(e) => println!("   ❌ 交易对信息失败: {}", e),
    }

    // 3. 24小时价格统计
    let test_symbol = match client.config().product_type {
        ProductType::Spot => "BTCUSDT",
        ProductType::UsdM => "BTCUSDT",
        ProductType::CoinM => "BTCUSD_PERP",
        ProductType::Options => "BTC-241227-100000-C",
        ProductType::Portfolio => "BTCUSDT",
    };

    match client.rest().market().get_24hr_ticker(Some(test_symbol)).await {
        Ok(ticker) => {
            println!("   ✅ {} 24小时价格: {}", test_symbol, ticker.last_price);
            println!("      价格变化: {} ({})", ticker.price_change, ticker.price_change_percent);
        },
        Err(e) => println!("   ❌ {} 24小时价格失败: {}", test_symbol, e),
    }

    // 4. 价格信息
    match client.rest().market().get_price(Some(test_symbol)).await {
        Ok(price) => println!("   ✅ {} 当前价格: {}", test_symbol, price.price),
        Err(e) => println!("   ❌ {} 当前价格失败: {}", test_symbol, e),
    }

    Ok(())
}

/// 测试需要认证的API
async fn test_authenticated_apis(client: &binance_sdk_unified::BinanceClient, _name: &str) -> Result<()> {
    println!("🔐 测试需要认证的API...");

    // 账户信息
    match client.rest().account().get_account().await {
        Ok(account) => {
            println!("   ✅ 账户信息获取成功");
            
            // 显示账户信息摘要
            match client.config().product_type {
                ProductType::Spot => {
                    println!("      现货余额数量: {}", account.balances.len());
                    if let Some(balance) = account.balances.first() {
                        println!("      第一个资产: {} (可用: {}, 锁定: {})", 
                                balance.asset, balance.free, balance.locked);
                    }
                },
                ProductType::UsdM | ProductType::CoinM => {
                    println!("      总钱包余额: {}", account.total_wallet_balance);
                    println!("      可用余额: {}", account.available_balance);
                    println!("      资产数量: {}", account.assets.len());
                    println!("      持仓数量: {}", account.positions.len());
                    
                    if let Some(asset) = account.assets.first() {
                        println!("      第一个资产: {} (余额: {}, 可用: {})", 
                                asset.asset, asset.wallet_balance, asset.available_balance);
                    }
                },
                _ => {
                    println!("      账户类型: {}", account.account_type);
                    println!("      余额数量: {}", account.balances.len());
                }
            }
        },
        Err(e) => {
            println!("   ❌ 账户信息失败: {}", e);
            println!("      (这是正常的，因为使用了测试API密钥)");
        }
    }

    Ok(())
}
